/**
 * @file applicationLib.h
 * @brief Definisce le API per i concrete command.
 *
 * @date Mar 1, 2012
 * @author Francesco Corvino
 */

#ifndef FACADERECV_H_
#define APPLICATIONLIB_H_

#include <stdlib.h>
#include <stdarg.h>
#include "../RscHost/factoryComm.h"
#include "../RscHost/rscApplication.h"

#define NAMELOG_APPLICATION_LIB "applicationLib"

////////////////////////////////////////////////////////////////////////////////////////
////// Funzioni per gestire le risorse di memoria //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////

/**
 * @brief Restituisce un attributo dell'applicazione
 *
 * L'attributo restituito, essendo l'ambiente concorrenziale, rappresenta un duplicato.
 *
 * @param key intero che indica l'attributo da ricavare
 * @return l'attributo richiesto e NULL se l'attributo non esiste.
 */
void * AppLib_getAttribute(const int key);

/**
 * @brief Aggiunge o modifica gli attributi in memoria.
 *
 * @param key chiave rappresentante l'attributo.
 * @param value valore da attribuire all'attributo.
 * @param dim dimensione dell'attributo.
 *
 * TODO @return il precedente valore dell'attributo, se l'attributo non esisteva prima restituisce null.
 */
void AppLib_setAttribute(const int key, void * value, size_t dim);

/**
 * @brief permette di effettuare operazioni atomiche su specifici attributi.
 *
 * Se l'attributo non esiste, l'operazione non viene eseguita. La chiamata
 * assicura che le risorse non vengano cambiate durante il periodo di esecuzione
 * dell'operazione.
 *
 * @param key chiave dell'attributo su cui effettuare l'operazione.
 * @param oper operazione da eseguire.
 */
int AppLib_atomicOperOnAttr(const int key,int (*oper)(void*));

/**
 * @brief Libera le risorse di memoria e termina l'esecuzione del processo.
 */
void AppLib_terminate();


////////////////////////////////////////////////////////////////////////////////////////
//////  Funzioni per la gestione delle risorse dell'Host   /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////

/**
 * @brief Effettua la scrittura della stringa passata sul rispettivo output con cui la thread sta comunicando.
 *
 * @deprecated utilizzare la funzione con gli argomenti variabili.
 * @param msg stringa da inviare.
 */
void AppLib_writeToHost(char * msg);

void AppLib_writeToHostF(char *fmt,...);

HostSession* AppLib_getMySession();

void AppLib_closeMySession();

/**
 * @brief Restituisce l'input dell'utente.
 */
int AppLib_readFromHost(char * buff, int maxsize);

/**
 * @brief Restituisce un parametro fornito dall'utente.
 *
 * Il parametro potrebbe esser impostato tramite la stessa request, la funzione
 * controlla che il parametro sia nella request, se non è presente richiede il parametro
 * all'utente.
 *
 * @return numero di byte inseriti.
 */
int AppLib_getParam(char* param, char* value, int maxsize);

////////////////////////////////////////////////////////////////////////////////////////
///////// Funzioni per la gestione delle comunicazioni di rete  ////////////////////////
////////////////////////////////////////////////////////////////////////////////////////



#endif /* APPLICATIONLIB_H_ */
